package com.navi.loaddata;


import com.navi.loaddata.utils.HistoryContext;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.Objects;
import java.util.UUID;

@Component
public class LoadMainCallable {

    private static final Logger logger = LoggerFactory.getLogger(LoadMainCallable.class);


    private JedisPool jedisPool = null;

    /**
     * 1.项目启动时，生成 SystemInstanceUUID，存入System.Properties中,作为项目实例的代码
     * 这样当一台服务器启动了两份实例时，可以通过 SystemInstanceUUID 判断是哪一个项目执行的结果
     * 2.生成项目名称
     */
    static {
        System.setProperty("SystemInstanceUUID", UUID.randomUUID().toString());
    }


    public boolean isMine(JedisPool jedisPool) {

        /**
         * 分布式锁
         * 1.项目启动时，生成 SystemInstanceUUID，存入System.Properties中,作为项目实例的代码
         * 这样当一台服务器启动了两份实例时，可以通过 SystemInstanceUUID 判断是哪一个项目执行的结果
         */
        String systemInstanceUUID = (String) System.getProperty("SystemInstanceUUID");
        /**
         * 确定本次任务的唯一标识
         * IP + 项目名称 + 项目实例名称
         */
        String ip = HistoryContext.getIp();
        String systemSequenceId = ip + "_loadsys_" + systemInstanceUUID;
        String jobKey = "loadKey";


        try (Jedis jedis = jedisPool.getResource()) {
            /**
             * 2.去redis中读取key，获得当前正在执行的任务
             *      如果值为空,代表没有任务正在执行,将当前的 systemSequenceId 写入，并设置有效时间
             *      若果值不为空，判断systemSequenceId是否相同
             *          不相同:代表此目录有任务正在执行，直接退出
             *
             **/
            if (jobCanStartAble(jedis, systemSequenceId, jobKey)) {
                jedis.set(jobKey, systemSequenceId);
                jedis.expire(jobKey, 300);
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            logger.error("任务[{}]出现错误" + systemSequenceId);
            logger.error(e.toString());
            e.printStackTrace();
            return false;
        }


    }



    private boolean jobCanStartAble(Jedis jedis, String systemSequenceId, String jobKey) {


        final String previousRunJobName = jedis.get(jobKey);
        if (StringUtils.isNotBlank(previousRunJobName)) {
            String old_ip = previousRunJobName.split("_")[0];
            logger.info("已有IP为"+old_ip+"的程序在运行");
        }
        /**
         * 判断systemSequenceId是否相同
         */
        if (StringUtils.isEmpty(previousRunJobName)) {
            return true;
        } else {
            if (Objects.equals(previousRunJobName, systemSequenceId)) {
                return true;
            } else {
                return false;
            }
        }
    }

}

